package collection;

import functional_programming.ConsumerDemo;
import space.position.Point;
import java.util.Arrays;
import java.util.Collection;
import java.util.Iterator;

/**
 * Collection接口
 * 统一定义了一套单列集合的接口
 * 继承Iterable接口
 * 是(java.util.Collection)是Java集合类的顶级接口之一，整个集合框架就围绕一组标准接口而设计
 * 有 3 种子类型集合: List、Set 和 Queue
 * 常用的具体实现类： ArrayList、LinkedList、HashSet、LinkedHashSet、ArrayBlockingQueue等
 *
 * 集合中存放的是元素的引用
 *
 * 在集合中若不指定泛型，则默认是Object类型
 * 若指定泛型的类型，则编译器在编译时会自动进行类型强制转换
 *
 * boolean add(E e) 	        向集合添加元素e，若指定集合元素改变了则返回true
 * boolean addAll(Collection<? extends E> c)	把集合C中的元素全部添加到集合中，若指定集合元素改变返回true
 * int size()	                集合的元素个数
 * void clear()	                清空集合中的所有元素
 * boolean isEmpty()	        判断指定集合的元素size是否为0
 * boolean contains(Object o)	判断指定集合是否包含对象o
 * boolean containsAll(Collection<?> c)     判断指定集合是否包含集合c的所有元素
 * boolean remove(Object o)                 删除集合中的元素对象o，若集合有多个o元素，则只会删除第一个元素
 * boolean removeAll(Collection<?> c）	    删交集，删除指定集合包含集合c的元素
 * boolean removeIf(Predicate<? super E> filter)   删除满足给定谓词的此集合的所有元素
 * boolean retainAll(Collection<?> c)	    取交集，从指定集合中保留包含集合c的元素,其他元素则删除
 * T[] toArray(T[] a)	        将集合转换为T类型的数组
 * Iterator<E> iterator()       获取该集合的迭代器
 *
 *
 * java8的新特性
 * Stream<E> stream()           获取该集合的流对象
 * forEach(Consumer<? super T> action)      Collection的父接口(Iterable)提供的默认方法，可以使用它进行集合遍历
 *
 *
 *
 * Collections
 * 静态方法
 * static void reverse(List<?> c)     反转List集合
 * */
public class CollectionDemo {
    public static void main(String[] args) {
        Integer[] arr = GetArray.randomIntArray(10, 100, 999);
        Collection<Integer> collection = Get.getArrayList(arr);
        System.out.println("Integer集合：");
        System.out.println("是否为空：" + collection.isEmpty());
        System.out.println("元素个数：" + collection.size());
        System.out.println("集合中的元素：\n\t" + Arrays.toString(collection.toArray()));
//        collection.clear();
//        System.out.println("清空集合\n元素个数：" + collection.size());

        Point[] points = GetArray.randomPointArray(10, 0, 6, 0, 6);
        Collection<Point> pointCollection = Get.getArrayList(points);
        System.out.println("\npoint（点）集合：");
        System.out.println("是否为空：" + pointCollection.isEmpty());
        System.out.println("元素个数：" + pointCollection.size());
        System.out.println("集合中的元素：\n\t" + pointCollection);

        Point point = new Point(10, 10);
        if (pointCollection.contains(point))
            System.out.println("集合中包含：\n\t" + point);
        else {
            System.out.println("集合中不包含：\n\t" + point);
            pointCollection.add(point);
        }
        Point[] points2 = GetArray.randomPointArray(5, 20, 30, 0, 6);
        Collection<Point> pointCollection1 = Get.getArrayList(points2);
        pointCollection.addAll(pointCollection1);
        System.out.println("集合中的元素：\n\t" + pointCollection);

        if (pointCollection.containsAll(pointCollection1))
            System.out.println("该集合中包含集合：\n\t" + pointCollection1);
        pointCollection.removeIf(p -> p.getY() == 1);   // 移除y坐标为1的所有点
        System.out.println("移除y坐标为1的所有点之后集合中的元素：\n\t" + pointCollection);
        pointCollection.retainAll(pointCollection1);  // 保留集合中包含集合pointCollection1的元素,其他元素则删除
        System.out.println("集合中的元素：\n\t" + pointCollection);

        Iterator<Point> iterator = pointCollection.iterator();
        while (iterator.hasNext()) {
            Point temp = iterator.next();
            System.out.println(temp);
        }
        for (Point temp : pointCollection)  // 增强for循环遍历集合时会被编译器编译为迭代器遍历
            System.out.println(temp);
        pointCollection.forEach(new ConsumerDemo<>());

//        Point[] points1 = (Point[]) pointCollection.toArray();    // 会报错，抛出ClassCastException异常
        Object[] points1 = pointCollection.toArray();       // 转为Object数组
        Point[] points3 = pointCollection.toArray(new Point[0]);    // 转为参数指定的类型的数组，
                                                // new Point[0] 的作用是指定返回值的类型

        pointCollection.clear();
        System.out.println("清空集合\n元素个数：" + pointCollection.size());

        System.out.println("\n------------------------------");
        for (Object temp : points1)
            System.out.println(temp);
        System.out.println("\n------------------------------");
        for (Point temp : points3)
            System.out.println(temp);
    }
}
